// 判断对象是否为空(null/String/List/Map)
bool isEmptyObject(Object? value) {
  if (value == null) return true;
  if (value is String) return value.isEmpty;
  if (value is Iterable) return value.isEmpty;
  if (value is Map) return value.isEmpty;
  return false;
}

// 判断对象是否非空(null/String/List/Map)
bool isNotEmptyObject(Object? value) {
  return !isEmptyObject(value);
}

// 是否为空对象
bool isEmptyMap(Map? map) {
  return map == null || map.isEmpty;
}

// 是否为空列表
bool isEmptyList(Iterable? list) {
  return list == null || list.isEmpty;
}

// 是否为空字符串
bool isEmptyString(String? str) {
  return str == null || str.isEmpty;
}

// 正则验证
bool _regex(String regex, String value) {
  if (value.isEmpty) return false;
  return RegExp(regex).hasMatch(value);
}

// 是否包含中文
bool isChinese(String value) {
  return _regex(r'[\u4e00-\u9fa5]', value);
}

// 是否为手机号
bool isMobile(String value) {
  return _regex(r'^1\d{10}$', value);
}

// 是否为邮箱
bool isEmail(String value) {
  return _regex(r'^([a-zA-z0-9]+[-_.]?)+@[a-zA-Z0-9]+.[a-z]+$', value);
}

// 是否为银行卡号
bool isBank(String value) {
  return _regex(r'^[1-9]\\d{9,29}$', value);
}

// 是否为版本号
bool isVersion(String value) {
  return _regex(r'^\d+(?:\.\d+){2}$', value);
}

// 是否为身份证号
bool isIDCard(String value) {
  return _regex(r'^\d{15}$|^\d{18}$|^\d{17}(\d|X|x)$', value);
}

// 是否为地址
bool isURL(String value) {
  return _regex(r'^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$', value);
}

// 是否为IP地址
bool isIP(String value) {
  return _regex(r'^((25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)$', value);
}

// 是否为日期
bool isDate(String value) {
  return _regex(r'^\d{4}-(?:1[0-2]|0[1-9])-(?:3[0-1]|[1-2][0-9]|0[1-9])$', value);
}

// 是否为日期时间
bool isDateTime(String value) {
  return _regex(
    r'^\d{4}-(?:1[0-2]|0[1-9])-(?:3[0-1]|[1-2][0-9]|0[1-9])\s(?:2[0-3]|1[0-9]|0[0-9]):(?:[1-5][0-9]|0[0-9]):(?:[1-5][0-9]|0[0-9])$',
    value,
  );
}

// 账号(只包含数字/字母/下划线/减号)
bool isAccount(String value, [min = 5, max = 16]) {
  return _regex("^[a-zA-Z0-9_-]{$min,$max}\$", value);
}

// 密码(包含字母、数字、特殊符，任意2种)
bool isPwd(String value, [min = 5, max = 16]) {
  return _regex("(?!^[0-9]+\$)(?!^[A-z]+\$)(?!^[^A-z0-9]+\$)^[^\\s\u4e00-\u9fa5]{$min,$max}\$", value);
}

// 是否相等(null/String/List/Map)
bool isEqual(Object? a, Object? b) {
  if (a == null || b == null) return a == b;
  if (a.runtimeType != b.runtimeType) return false;
  // Map对比
  if (a is Map) {
    if (a.keys.length != (b as Map).keys.length) return false;
    for (final key in a.keys) {
      if (!b.containsKey(key) || !isEqual(a[key], b[key])) {
        return false;
      }
    }
    return true;
  }
  // List对比
  if (a is List) {
    if (a.length != (b as List).length) return false;
    for (int i = 0; i < a.length; i++) {
      if (!isEqual(a[i], b[i])) return false;
    }
    return true;
  }
  // 基本类型直接比较
  return a == b;
}
